/**
 * Copyright (C) 2025 pony working team
 * SPDX-License-Identifier: MulanPSL-2.0
 */

#include <gtest/gtest.h>

#include "x_compiler.h"

class TestCompiler : public ::testing::Test
{
protected:
    void SetUp() {};

    void TearDown() {};
};

TEST_F(TestCompiler, __fls_u32)
{
    // 4    - 0000 0000 0000 0000 0000 0000 0000 0100
    //                                            2
    // 100  - 0000 0000 0000 0000 0000 0000 0110 0100
    //                                       6
    // 1024 - 0000 0000 0000 0000 0000 0100 0000 0000
    //                                  10
    EXPECT_EQ(__fls_u32(4), 2);
    EXPECT_EQ(__fls_u32(100), 6);
    EXPECT_EQ(__fls_u32(1024), 10);
}

TEST_F(TestCompiler, __fls_u64)
{
    // 1099511627776 - 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
    //                    40
    // 1099511627821 - 0001 0000 0000 0000 0000 0000 0000 0000 0000 0010 1101
    //                    40
    EXPECT_EQ(__fls_u64(1099511627776), 40);
    EXPECT_EQ(__fls_u64(1099511627821), 40);
}

TEST_F(TestCompiler, __clz_u32)
{
    // EXPECT_EQ(__clz_u32(0), 31);
    EXPECT_EQ(__clz_u32(4), 29);
    EXPECT_EQ(__clz_u32(100), 25);
    EXPECT_EQ(__clz_u32(1024), 21);
}

TEST_F(TestCompiler, __ctz_u32)
{
    EXPECT_EQ(__ctz_u32(4), 2);
    EXPECT_EQ(__ctz_u32(100), 2);
    EXPECT_EQ(__ctz_u32(1024), 10);
}

TEST_F(TestCompiler, __clz_u64)
{
    // EXPECT_EQ(__clz_u64(0), 63);
    EXPECT_EQ(__clz_u64(4), 61);
    EXPECT_EQ(__clz_u64(1099511627776), 23);
    EXPECT_EQ(__clz_u64(1099511627821), 23);
}

TEST_F(TestCompiler, __ctz_u64)
{
    EXPECT_EQ(__ctz_u64(4), 2);
    EXPECT_EQ(__ctz_u64(1099511627776), 40);
    EXPECT_EQ(__ctz_u64(1099511627821), 0);
}
